package com.aote.expression.paramprocessor;

import java.util.Map;

import org.w3c.dom.Element;

import com.aote.expression.Param;
import com.aote.page.PageException;
import com.browsesoft.dbtools.DBTools;
import com.browsesoft.htmlcomponent.HTMLBasicComponent;
import com.browsesoft.tools.BSCalendar;

/**
 * 获得月报表中的月份。取历史报表中最后一个月＋1的值，如果没有历史报表，取本月－1的值。
 * 如果从历史报表中取得的月份超过系统时间的上个月，抛出没有合适的值异常。
 */
public class ReportMonthProcessor implements ParameterProcessor {
	public String process(Param param, Map attributes,
			HTMLBasicComponent component, Element config)
			throws NoFitValueException {
		try {
			String format = (String)param.getParams().get("format");
			// 得到月份最大值+1
			String name = config.getAttribute("name");
			String tname = component.getElement().getAttribute("tablename");
			String sql = "select max(" + name + ") from " + tname;
			String[][] datas = DBTools.executeQueryWithTableHead(sql);
			// 如果没有，返回当前月前一个月的内容
			BSCalendar now = BSCalendar.nowMonth();
			if (datas[1][0].equals("")) {
				return now.getCalendarAfterMonth(-1).toString(format);
			}
			BSCalendar result = new BSCalendar(datas[1][0] + "01");
			result = result.getCalendarAfterMonth(1);
			// 如果到了本月，抛出无合适值异常
			if (result.getMonthDispersion(now) == 0) {
				String msg = this.getErrorMsg(config);
				throw new PageException(msg);
			}
			return result.toString(format);
		} catch (PageException e) {
			throw e;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 得到错误信息，如果没有，给出默认值
	 */
	private String getErrorMsg(Element config) {
		String result = config.getAttribute("error");
		if(result != null) {
			return result;
		}
		result = "上月数据已经产生";
		return result;
	}
}
